/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Abastecimiento;

import commonsbeans.ApplicationBean;
import commonsbeans.SessionBean;
import entities.Construccion;
import entities.ConstruccionMaterialConstruccion;
import entities.EstadoConstruccion;
import entities.Proveedor;
import entities.ProveedorConstruccion;
import entities.ProveedorMaterialConstruccion;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import persistence.ConstruccionJpaController;
import persistence.ConstruccionMaterialConstruccionJpaController;
import persistence.EstadoConstruccionJpaController;
import persistence.ProveedorConstruccionJpaController;
import persistence.ProveedorJpaController;
import persistence.ProveedorMaterialConstruccionJpaController;
import persistence.exceptions.PreexistingEntityException;
import persistence.exceptions.RollbackFailureException;

/**
 *
 * @author Felipe Duarte
 */
@ManagedBean
@ViewScoped
public class GestionCalificacionProveedorAbastecimiento {

    @ManagedProperty(value = "#{sessionBean}")
    private SessionBean sessionBean;
    @ManagedProperty(value = "#{applicationBean}")
    private ApplicationBean applicationBean;
    private ProveedorMaterialConstruccionJpaController proveedorMaterialConstruccionJpaController = null;
    private ProveedorJpaController proveedorJpaController = null;
    private ProveedorConstruccionJpaController proveedorConstruccionJpaController = null;
    private ConstruccionJpaController construccionJpaController = null;
    private EstadoConstruccionJpaController estadoConstruccionJpaController = null;
    public List<Construccion> listaConstrucciones = new ArrayList<Construccion>();
    public Construccion construccionSelected = new Construccion();
    public List<ProveedorMaterialConstruccion> listaCalificaciones = new ArrayList<ProveedorMaterialConstruccion>();
    public List<ProveedorConstruccion> listaCalificados = new ArrayList<ProveedorConstruccion>();
    public List<Proveedor> listaProveedores = new ArrayList<Proveedor>();

    @PostConstruct
    private void init() {
        initControllers();
        cargarProveedoresCiudad();
        cargarConstrucciones();
        cargarProveedoresCalificados();

    }
    public void actualizar(){
     cargarProveedoresCiudad();
     cargarConstrucciones();
     cargarProveedoresCalificados();
    }

    private void cargarConstrucciones() {
        EstadoConstruccion ec = estadoConstruccionJpaController.findEstadoConstruccion(1);
        listaConstrucciones.clear();
        listaConstrucciones = construccionJpaController.findConstruccionCiudadActivas(sessionBean.getUsuarioActual().getCiudadIdCiudad().getIdCiudad(), ec);

    }

    private void cargarProveedoresCiudad() {
        listaProveedores.clear();
        listaProveedores = proveedorJpaController.getProveedorPorCiudadAbastecimiento(sessionBean.getUsuarioActual().getCiudadIdCiudad());
    }

    private void cargarProveedoresCalificados() {
        listaCalificados.clear();
        List<ProveedorConstruccion> listaAlterna = new ArrayList<ProveedorConstruccion>();
        for (int i = 0; i < listaProveedores.size(); i++) {
            Proveedor p = listaProveedores.get(i);
            listaAlterna.clear();
            listaAlterna = proveedorConstruccionJpaController.getProveedorCalificadoAbastecimiento(p);
            int acumulado = 0, total = 0;

            Proveedor p1 = new Proveedor();
            for (int j = 0; j < listaAlterna.size(); j++) {

                p1 = listaAlterna.get(j).getProveedorIdProveedor();
                String calificacion = listaAlterna.get(j).getValorCalificacionProveedor();
                acumulado = acumulado + Integer.parseInt(calificacion);
            }

            total = listaAlterna.size();
            if (total > 0) {
                int totalizado = acumulado / total;
                ProveedorConstruccion pc = new ProveedorConstruccion();
                pc.setValorCalificacionProveedor(String.valueOf(totalizado));
                pc.setProveedorIdProveedor(p1);

                listaCalificados.add(pc);
            }
        }

    }

    public void cargarProveedores() {

        if (!proveedorConstruccionJpaController.findConstruccionCalificada(construccionSelected).isEmpty()) {
            applicationBean.showWarnMessage("Los proveedores para esta construcción ya han sido calificados");
        }
        listaCalificaciones.clear();
        List<Proveedor> listaProveedores = new ArrayList<Proveedor>();
        for (int g = 0; g < construccionSelected.getConstruccionMaterialConstruccionList().size(); g++) {
            ConstruccionMaterialConstruccion cmc = construccionSelected.getConstruccionMaterialConstruccionList().get(g);
            for (int h = 0; h < cmc.getIdMaterialConstruccionConstruccionMaterialConstruccion().getProveedorMaterialConstruccionList().size(); h++) {
                ProveedorMaterialConstruccion pmc = cmc.getIdMaterialConstruccionConstruccionMaterialConstruccion().getProveedorMaterialConstruccionList().get(h);
                Proveedor p = pmc.getProveedorIdProveedor();
                if (listaProveedores.isEmpty()) {
                    listaProveedores.add(p);
                    listaCalificaciones.add(pmc);

                } else {
                    if (!listaProveedores.contains(p)) {
                        listaCalificaciones.add(pmc);

                        listaProveedores.add(p);
                    }
                }
            }
        }


    }

    public void guardarCalificacion() {
        System.out.println("Entro");
        int maximo = proveedorConstruccionJpaController.getIdMax() + 1;
        for (int i = 0; i < listaCalificaciones.size(); i++) {
            ProveedorMaterialConstruccion pmc = listaCalificaciones.get(i);
            ProveedorConstruccion pc = new ProveedorConstruccion();
            pc.setIdProveedorConstruccion(maximo);
            pc.setValorCalificacionProveedor(pmc.getCalificacionProveedorMaterialConstruccion());
            pc.setConstruccionIdConstruccion(construccionSelected);
            pc.setProveedorIdProveedor(pmc.getProveedorIdProveedor());
            pc.setIdProveedorConstruccion(maximo);
            pc.setCalificacionProveedorConstruccion(true);
            try {
                proveedorConstruccionJpaController.create(pc);
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(GestionCalificacionProveedorAbastecimiento.class.getName()).log(Level.SEVERE, null, ex);
            } catch (RollbackFailureException ex) {
                Logger.getLogger(GestionCalificacionProveedorAbastecimiento.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(GestionCalificacionProveedorAbastecimiento.class.getName()).log(Level.SEVERE, null, ex);
            }
            maximo++;
        }
        applicationBean.showSuccessMessage("Se ha guardado la calificación de los proveedores para la construcción: " + construccionSelected.getNombreConstruccion());
        limpiarFormulario();
        cargarProveedoresCiudad();
        cargarConstrucciones();
        cargarProveedoresCalificados();
        
    }

    private void limpiarFormulario() {
        construccionSelected = new Construccion();
        listaCalificaciones.clear();
    }

    //<editor-fold defaultstate="collapsed" desc="Getter's y setter's">
    public SessionBean getSessionBean() {
        return sessionBean;
    }

    public void setSessionBean(SessionBean sessionBean) {
        this.sessionBean = sessionBean;
    }

    public ApplicationBean getApplicationBean() {
        return applicationBean;
    }

    public void setApplicationBean(ApplicationBean applicationBean) {
        this.applicationBean = applicationBean;
    }

    public List<ProveedorConstruccion> getListaCalificados() {
        return listaCalificados;
    }

    public void setListaCalificados(List<ProveedorConstruccion> listaCalificados) {
        this.listaCalificados = listaCalificados;
    }

    public List<Construccion> getListaConstrucciones() {
        return listaConstrucciones;
    }

    public void setListaConstrucciones(List<Construccion> listaConstrucciones) {
        this.listaConstrucciones = listaConstrucciones;
    }

    public Construccion getConstruccionSelected() {
        return construccionSelected;
    }

    public void setConstruccionSelected(Construccion construccionSelected) {
        this.construccionSelected = construccionSelected;
    }

    public List<ProveedorMaterialConstruccion> getListaCalificaciones() {
        return listaCalificaciones;
    }

    public void setListaCalificaciones(List<ProveedorMaterialConstruccion> listaCalificaciones) {
        this.listaCalificaciones = listaCalificaciones;
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Inicializar los controladores">
    public void initControllers() {
        FacesContext context = FacesContext.getCurrentInstance();
        proveedorJpaController = (ProveedorJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "proveedorJpaController");
        proveedorMaterialConstruccionJpaController = (ProveedorMaterialConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "proveedorMaterialConstruccionJpaController");
        proveedorConstruccionJpaController = (ProveedorConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "proveedorConstruccionJpaController");
        construccionJpaController = (ConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "construccionJpaController");
        estadoConstruccionJpaController = (EstadoConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "estadoConstruccionJpaController");

    }
    //</editor-fold>
}
